package db;

/**
 * Beinhaltet alle Datenbankabfragen für 
 * die Übungen
 * 
 * @author eric
 */
public class exercises {
    /**
    * Gibt den Namen einer Übung anhand der ID zurück
    * @author eric
    * @param id ID der Übung
    * @return Name der Übung als String
    */
    public static String getName (String id) {
        try{
            String sql = "SELECT name FROM exercises WHERE ID=" + id;
            String nameArray[][] = db.MySQLConnection.getInstance().getGenericQuery(sql);
            return nameArray[0][0];
        } catch (Exception e){
            return "Fehler";
        }    
    }

    /**
    * Erstellt eine neue Übung
    * @author eric
    * @param category ID der Kategorie der Übung
    * @param name Bezeichung der Übung
    * @param rating Schwierigkeitsgrad der Übung
    * @param popularity Beliebtheit der Übung
    * @param procedure Ablauf der Übung
    * @param notes Hinweise für den Trainer
    * @param partMin minimale Anzahl an Teilnehmern
    * @param partMax maximale Anzahl an Teilnehmer
    * @param buildup Aufbau für die Übung
    * @param tools Hilfsmittel für die Übung
    * @param duration Dauer der Übung
    * @param aim Ziel der Übung
    */
    public static void setEntry (String category, String name, String rating,
            String popularity, String procedure, String notes, String partMin, String partMax,
            String buildup, String tools, String duration, String aim) {

            // SQL String für die Abfrage zusammenbauen
            String sql = "INSERT INTO exercises (`categories.ID`, `name`, `rating`, "
                       + "`popularity`, `procedure`, `notes`, `participantMin`, "
                       + "`participantMax`, `buildup`, `tools`, `duration`, `aim`) VALUES ("
                       + "?,?,?,?,?,?,?,?,?,?,?,?)";

            String[] param = {category, name, rating, popularity, procedure, notes, partMin, partMax, buildup, tools, duration,aim};
            db.MySQLConnection.getInstance().executeStatement(sql, param);
    }

    /**
    * Aktualisiert eine Übung
    * @author eric
    * @param id ID der Übung
    * @param category ID der Kategorie der Übung
    * @param name Bezeichung der Übung
    * @param rating Schwierigkeitsgrad der Übung
    * @param popularity Beliebtheit der Übung
    * @param procedure Ablauf der Übung
    * @param notes Hinweise für den Trainer
    * @param partMin minimale Anzahl an Teilnehmern
    * @param partMax maximale Anzahl an Teilnehmer
    * @param buildup Aufbau für die Übung
    * @param tools Hilfsmittel für die Übung
    * @param duration Dauer der Übung
    * @param aim Ziel der Übung
    */
    public static void updateEntry( String id, String category, String name, String rating,
                                    String popularity, String procedure, String notes,
                                    String partMin, String partMax, String buildup,
                                    String tools, String duration, String aim) {

            // SQL String für die Abfrage zusammenbauen
            String sql = "UPDATE exercises SET"
                    + " `categories.ID` = ?"
                    + ", `name` = ?"
                    + ", `rating` = ?"
                    + ", `popularity` = ?"
                    + ", `procedure` = ?"
                    + ", `notes` = ?"
                    + ", `participantMin` = ?"
                    + ", `participantMax` = ?"
                    + ", `buildup` = ?"
                    + ", `tools` = ?"
                    + ", `aim` = ?"
                    + ", `duration` = ?"
                    + " WHERE `ID` = ?";

            String[] param = {category, name, rating, popularity, procedure, notes, partMin, partMax, buildup, tools, aim, duration, id};
            db.MySQLConnection.getInstance().executeStatement(sql, param);
    }

    /**
    * Gibt alle Übungen für eine Kategorie zurück
    * @author felix
    * @param id ID der Kategorie
    * @return Stringarray mit allen Übungen der Kategorie
    */
    public static String[][] getAllExercisesByCategoryId(String id){
        String sql = "SELECT name, ID, `procedure`, notes, participantMin, participantMax, buildup, tools, duration, aim, rating FROM exercises WHERE `categories.ID`=" + id + " ORDER BY popularity DESC";
        String categories[][] = db.MySQLConnection.getInstance().getGenericQuery(sql);

        return categories;

    }

    /**
    * Gibt Details einer Übung anhand der ID zurück
    * @author felix
    * @param id ID der Übung
    * @return Stringarray mit dem Inhalt der Übung
    */
    public static String[] getExerciseDetailsByExerciseId(String id){
        String sql = "SELECT name, ID, `procedure`, notes, participantMin, participantMax, buildup, tools, duration, aim FROM exercises WHERE `ID`=" + id;
        String exercises[][] = db.MySQLConnection.getInstance().getSingleResultRow(sql);

        String[] returnExercise = exercises[0];

        return returnExercise;
    }

    /**
    * Gibt alle Werte einer Übung in unspezifischer Reihenfolge zurück
    * @author eric
    * @param id ID der Übung
    * @return Stringarray mit Inhalt der Übung
    */
    public static String[] getAllExerciseDetailsByExerciseId(String id){
        // Gibt alle Daten in der Reihenfolge der Tabellenspalten der DB aus
        String sql = "SELECT * FROM exercises WHERE `ID`=" + id;
        String exercises[][] = db.MySQLConnection.getInstance().getSingleResultRow(sql);
        String[] returnExercise = exercises[0];
        return returnExercise;
    }

    /**
    * Erhöht die Beliebtheit der Übungen, nachdem sie in einen Trainingsplan
    * aufgenommen wurden
    * @author felix
    * @param exercises Stringrray von Übungen, aus dem Trainingsplan
    */
    public static void increasePopularity(String[][] exercises){
        for(String[] exercise: exercises)
            {
                String sql = "UPDATE exercises SET popularity = popularity + 1 ";
                sql += "WHERE ID = " + exercise[1];

                db.MySQLConnection.getInstance().executeQuery(sql);
            }
    }

    /**
    * Ermittelt die Gesamtdauert der übergebenen Übungen
    * @author felix
    * @param ids IDs der Übungen, deren Werte addiert werden sollen
    * @return Gesamtdauer als String
    */
    public static String getExercisesDuration(String[][] ids){
        //String sql = "SELECT name, ID, `procedure`, notes, participantMin, participantMax, buildup, tools, duration, aim FROM exercises WHERE `ID`=" + id;
        String sql = "SELECT SUM(duration) FROM exercises WHERE ID IN (";

        int arrayCount = ids.length;
        int count = 1;

        for(String[] id: ids){
            sql += id[0];
            if(count != arrayCount){
                sql += ",";
            }
            count++;
        }

        sql += ")";

        String durations[][] = db.MySQLConnection.getInstance().getSingleResultRow(sql);

        String duration = durations[0][0];

        return duration;

    }

    /**
    * Erstellt eine Tabelle für eine Übung mit deren Detailangaben
    * @author eric
    * @param id ID der Übung
    * @return HTML-Tabelle als String
    */
    public static String getExerciseHtmlViewById(String id) {
        String sql = "SELECT * FROM exercises where ID=" + id + ";";
        String[] result = db.MySQLConnection.getInstance().getShortSingleResultRow(sql);
        String ret = "";

        if (result != null) {
        // Tabellenzeile 1 aufbauen
        ret = "<table><tr><td colspan=\"5\"><h3>Übung Nr: " + result[0] + " - " + result[2] + " <a href=\"editExercise.jsp?id=" + result[0] + "\"><img src=\"pict/edit.png\"></a></h3></td></tr>"

                // 2. Zeile
                + "<tr><th width=\"20%\">Übungsziel</th><th width=\"40%\">Ablauf</th><th width=\"20%\">Hilfsmittel</th><th width=\"10%\">Spieler</th><th width=\"10%\">Dauer</th></tr>"
                + "<tr><td rowspan=\"3\">" + result[11]
                + "</td><td>" + result[5]
                + "</td><td>" + result[10]
                + "</td><td>" + result[7]
                + " - " + result[8]
                + "</td><td>" + result[12]
                + " Minuten</td></tr>";

        // Tabellenzeile 3  - Texttabelle erstellen
        ret += "<tr><th>Aufbau</th><th>Notizen</th><th>Grad</th><th>Kategorie</th></tr>"
               
                + "</td><td>" + result[9]
                + "</td><td>" + result[6]
                + "</td><td>" + result[3]
                + "</td><td>" + db.categories.getName(result[1])
                + "</td></tr></table>";
         }

        return ret;
    }

    /**
    * Zählt die gesamte Anzahl an Übungen
    * @author eric
    * @return Anzahl an Übungen als Integer-Zahl
    */
    public static int countExercises(String sportart) {
        return db.MySQLConnection.getInstance().countEntrys("exercises", sportart);
    }

    /**
    * Zählt die gesamte Anzahl an Übungen einer Kategorie
    * @author felix
    * @param category ID der Kategorie
    * @return Anzahl an Übungen als Integer-Zahl
    */
    public static String countExercisesByCategory(String category) {
           String sql = "SELECT count(*) FROM exercises WHERE `categories.ID`=" + category;

           String[][] exercises = db.MySQLConnection.getInstance().getSingleResultRow(sql);

           return exercises[0][0];
    }

    /**
    * Gibt Übungen gestaffelt zurück
    * @author felix
    * @param limit Gibt an ab welcher Zeile das Ergebnis anfängt
    * @return Stringarray mit geordnetten Übungen
    */
    public static String[][] getAllExercisesOrdered (String limit, String sportart){
        String sql = "SELECT ID FROM `exercises` AS e, "
                + "`categoriessport` AS c WHERE e."
                + "`categories.ID` = c.`categories.ID` "
                + "AND c.`typeOfSport.ID` = " + sportart
                + " ORDER BY ID ASC ";

        if(limit != null) {
            sql += " LIMIT " + limit + ", 10";
        } else {
            sql += " LIMIT 0, 10";
        }

        String exercises[][] = db.MySQLConnection.getInstance().getGenericQuery(sql);

        return exercises;
    }
}
